#pragma once

#include <algorithm>
#include <iostream>
#include <fstream>
#include <filesystem>
#include <sstream>
#include <unordered_map>
#include <execution>
#include <mutex>
#include <atomic>
#include <numeric>

#include <rapidfuzz/rapidfuzz_all.hpp>

// 定义结构体存储文件名和相似度
struct FileSimilarity
{
    std::filesystem::path path;
    double similarity;

    bool operator<(const FileSimilarity &other) const
    {
        return similarity > other.similarity;
    }
};

/**
 * 用于拼接字符串
 * 传入一个容器和目标字符串
 */
void records_join(std::vector<std::string> &records, std::string &records_string);

/**
 * 提取cast文件的操作
 * 传入一个容器和cast文件的路径
 */
void process_cast_file(std::vector<std::string> &records, const std::filesystem::path &cast_file,std::vector<std::string> &copy_str);

/**
 * 初始化用函数(提取操作)
 * 传入一个路径
 */
std::vector<std::string> process_cast_file_init(const std::filesystem::path &cast_file);

/**
 * 对比文件获得最高的相似率
 *传入拼接后的字符串和cast文件库
 */
std::vector<FileSimilarity> check_similarity(
    const std::string &records_string,
    const std::filesystem::path &cast_lib_dir);
